package com.ypj.indusynergyems.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ypj.indusynergyems.common.convention.exception.ClientException;
import com.ypj.indusynergyems.dao.entity.MenuEntity;
import com.ypj.indusynergyems.dao.mapper.MenuMapper;
import com.ypj.indusynergyems.service.IMenuService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * 菜单接口实现层
 */
@Service
@RequiredArgsConstructor
public class MenuServiceImpl extends ServiceImpl<MenuMapper, MenuEntity> implements IMenuService {

    private final MenuMapper menuMapper;

    @Override
    public List<MenuEntity> findAllMenu() {
        LambdaQueryWrapper<MenuEntity> queryWrapper = Wrappers.lambdaQuery(MenuEntity.class)
                .eq(MenuEntity::getIsShow, 1);
        List<MenuEntity> lists = baseMapper.selectList(queryWrapper);
        //(2)遍历所有菜单列表，为菜单的父菜单对象赋值
        for(int i = 0 ; i<lists.size();i++){
            //获取菜单的父菜单id
            int parent_id = lists.get(i).getParentId();
            //（3）根据父id去查询具体的菜单信息
            // null -- 一级   不为null--判断是否为三级（menu的父id的有值--三级，没值--二级）
            MenuEntity menu = menuMapper.findMenuByParentId(parent_id);
            //（4）判断父id是否0，如果不为0，还要继承查询父菜单信息
            if(menu!=null && menu.getParentId()!=0){
                menu.setParent(menuMapper.findMenuByParentId(menu.getParentId()));
            }
            lists.get(i).setParent(menu);
        }
        return lists;
    }

    @Override
    public List<MenuEntity> findUserMenuList(int roleId) {
        List<MenuEntity> lists = menuMapper.findUserMenuList(roleId);
        //(2)遍历所有菜单列表，为菜单的父菜单对象赋值
        for(int i = 0 ; i<lists.size();i++){
            //获取菜单的父菜单id
            int parent_id = lists.get(i).getParentId();
            //（3）根据父id去查询具体的菜单信息
            // null -- 一级   不为null--判断是否为三级（menu的父id的有值--三级，没值--二级）
            MenuEntity menu = menuMapper.findMenuByParentId(parent_id);
            //（4）判断父id是否0，如果不为0，还要继承查询父菜单信息
            if(menu!=null && menu.getParentId()!=0){
                menu.setParent(menuMapper.findMenuByParentId(menu.getParentId()));
            }
            lists.get(i).setParent(menu);
        }
        return lists;
    }

    @Override
    public void addMenu(MenuEntity menu) {
        MenuEntity menuEntity = MenuEntity.builder()
                .menuId(null)
                .menuName(menu.getMenuName())
                .url(menu.getUrl())
                .icon(menu.getIcon())
                .sort(menu.getSort())
                .parentId(menu.getParentId())
                .isButton(menu.getIsButton())
                .isShow(menu.getIsShow())
                .build();
        baseMapper.insert(menuEntity);
    }

    @Override
    public MenuEntity findMenuDetail(int menuId) {
        LambdaQueryWrapper<MenuEntity> queryWrapper = Wrappers.lambdaQuery(MenuEntity.class)
                .eq(MenuEntity::getMenuId, menuId);
        return baseMapper.selectOne(queryWrapper);
    }

    @Override
    public void editMenu(MenuEntity menu) {
        MenuEntity menuEntity = MenuEntity.builder()
                .menuId(null)
                .menuName(menu.getMenuName())
                .url(menu.getUrl())
                .icon(menu.getIcon())
                .sort(menu.getSort())
                .parentId(menu.getParentId())
                .isButton(menu.getIsButton())
                .isShow(menu.getIsShow())
                .build();
        LambdaUpdateWrapper<MenuEntity> updateWrapper = Wrappers.lambdaUpdate(MenuEntity.class)
                .eq(MenuEntity::getMenuId,menu.getMenuId());
        int update = baseMapper.update(menuEntity, updateWrapper);
        if (update<0){
           throw new ClientException("操作有误,请重新修改");
        }
    }

    //删除菜单
    @Override
    public String deleteMenu(int menuId) {
        //1.判断要删除的菜单，是否有角色拥有此菜单操作权限
        String role_id = menuMapper.findRoleByMenuId(menuId);
        if (role_id!=null){
            //2. 有--证明有角色操作此菜单的权限，提示请处理完角色权限，再删除菜单
            return "有角色使用了此菜单，请处理完角色权限，再删除菜单";
        }else{
            //3.没有--证明没有角色使用此菜单，可以进行下一步判断
            //4.判断要删除的菜单，是否有子菜单
            //select * from t_menu where parent_id = #{menuId} limit 1
            MenuEntity menu = menuMapper.findMenuChild(menuId);
            if (menu!=null){
                //有--提示，先删除子菜单
                return "请先删除该菜单下的子菜单，否则无法删除";
            }else{
                //没有--直接删除 delete from t_menu where id = #{menuId}
                int res = menuMapper.deleteMenu(menuId);
                return res>0?"success":"fail";
            }
        }
    }

}
